//1.打开电源之后，按下一个开始按钮，上一次打地鼠的计数得分会清零，四个led灯随机亮起一个，亮1-2秒后熄灭，
//然后就是随机亮起另一个led灯，以此循环，整个过程持续一分钟，一分钟之后停止led灯的随机闪烁（结束游戏），
//此时必须再次按下开始按钮才能开始游戏
//（另外结束游戏之后四位数码管记录的得分不会有任何改变，除非按下开始按钮进入下一次游戏）。
//2.led灯亮起的时候，按下对应的按钮后即可得1分，用来纪录得分的四位数码管上数字+1（0→1）。
//3.若是按错按钮，则蜂鸣器响起来提示按错了。
//4.请使用USB供电

#include <SevenSegmentTM1637.h>
#include <EEPROM.h>

SevenSegmentTM1637  display(A0, A1);
volatile int num;         //产生的随机数
volatile int test;         //有效随机数
volatile int Game_score;         //比赛分数
volatile long time_start;         //开始时间
volatile boolean tag;         //等待按键按下的标记
volatile boolean Game_time;         //游戏时间
volatile int buzzer;         //蜂鸣器引脚
volatile int score_max;         //最高分

//关灯
void LED_down() {
  for (int i = 3; i <= 6; i = i + (1)) {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
}

//游戏结束
void Stop() {
  for (int i = 3; i <= 6; i = i + (1)) {         //打开所有灯
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
  if (score_max < Game_score) {         //记录最高分
    EEPROM.put(0, Game_score);

  }
}

void setup() {
  display.begin();
  Serial.begin(9600);
  num = 0;
  test = 0;
  Game_score = 0;
  time_start = 0;
  tag = false;
  Game_time = false;
  buzzer = 12;         //蜂鸣器接12号
  score_max = 0;
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);         //7-11为按键
  pinMode(buzzer, OUTPUT);
  digitalWrite(buzzer, LOW);
  LED_down();
  EEPROM.get(0, score_max);         //获取最高分
  display.clear();
  display.setBacklight(20);
  display.print(score_max);         //显示分数
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);         //3-6LED引脚
}

void loop() {
  while (true == Game_time) {         //如果是游戏时间
    randomSeed(millis());         //初始化随机数
    num = random(3, 7);         //产生随机数
    if (test != num) {         //随机数和上一次的随机数不同，则为有效
      test = num;         //更新对比的随机数
      Serial.println(test);
      pinMode(buzzer, OUTPUT);
      digitalWrite(buzzer, LOW);
      pinMode(test, OUTPUT);
      digitalWrite(test, HIGH);         //亮灯
      tag = true;
      while (true == tag && 60000 > millis() - time_start) {         //时间是60秒
        while ((0 == digitalRead(8) || 0 == digitalRead(9)) || (0 == digitalRead(10) || 0 == digitalRead(11))) {         //有按键按下
          delay(10);
          if (0 == digitalRead(8)) {         //如果是8号引脚的按键按下
            Serial.println(7);
            if (3 == test) {         //如果亮灯的为3号，则为正确
              digitalWrite(3, LOW);         //关灯
              tag = false;
              Game_score = Game_score + 1;         //分数加1
              display.print(Game_score);         //显示

            } else {         //如果没有按对
              pinMode(buzzer, OUTPUT);
              digitalWrite(buzzer, HIGH);         //打开蜂鸣器

            }

          } else if (0 == digitalRead(9)) {
            Serial.println(8);
            if (4 == test) {
              digitalWrite(4, LOW);
              tag = false;
              Game_score = Game_score + 1;
              display.print(Game_score);

            } else {
              pinMode(buzzer, OUTPUT);
              digitalWrite(buzzer, HIGH);

            }
          } else if (0 == digitalRead(10)) {
            Serial.println(9);
            if (5 == test) {
              digitalWrite(5, LOW);
              tag = false;
              Game_score = Game_score + 1;
              display.print(Game_score);

            } else {
              pinMode(buzzer, OUTPUT);
              digitalWrite(buzzer, HIGH);

            }
          } else if (0 == digitalRead(11)) {
            Serial.println(10);
            if (6 == test) {
              digitalWrite(6, LOW);
              tag = false;
              Game_score = Game_score + 1;
              display.print(Game_score);

            } else {
              pinMode(buzzer, OUTPUT);
              digitalWrite(buzzer, HIGH);

            }
          }
          while ((0 == digitalRead(8) || 0 == digitalRead(9)) || (0 == digitalRead(10) || 0 == digitalRead(11))) {         //按键不松手时等待
          }
        }
        if (0 == digitalRead(7)) {         //如果7号按键按下
          delay(20);
          while (0 == digitalRead(7)) {
          }
          delay(20);
          Game_time = false;         //游戏时间结束
          tag = false;
          Stop();         //停止游戏

        }
      }

    }
    if (60000 < millis() - time_start) {         //如果超60秒时
      Game_time = false;         //
      Stop();         //停止

    }
  }

  if (0 == digitalRead(7)) {         //如果按下7号引脚按键
    delay(20);
    while (0 == digitalRead(7)) {
    }
    delay(20);
    Game_time = true;         //设置为游戏时间
    time_start = millis();         //开始计时
    Game_score = 0;         //清空计分
    display.clear();         //显示屏清空
    display.print(Game_score);
    pinMode(buzzer, OUTPUT);
    digitalWrite(buzzer, LOW);
    LED_down();         //关灯

  }

}
